package demo2;

public class Test {
    public static void main(String[] args) {

    }
}

//什么是泛型：数据类型参数化

//泛型java到底怎么编译的？
//擦除机制

class Alg <E extends Comparable <E>>{
    //代表将来指定的参数类型1一定是实现了这个接口的

    //泛型在定义的时候在后面加extends 泛型的上界
    // E extends Number E是Number的子类 或者 E是NUmber本身
    //E extends 后面加接口，表示该泛型一定是实现该接口的(已经实现了这个接口的)
    //E extends 后面加类 表示该泛型是这个类的子类或者是这个类本身
    public E findMax(E[] array) {
        E max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Alg<Integer> alg = new Alg<>();
        Integer[] array = {1,3,2,2,3,2,2};
        Integer val = alg.findMax(array);
        System.out.println(val);
    }

    //那为什么不能实现一个类呢？


}


class A<E extends Number> {
    public static void main(String[] args) {
        A<Number> a1 = new A<>();
        A<Integer> a2 = new A<>();
        A<Double> a3 = new A<>();
//      A<String> a4 = new A<String>();
//      string并不是Number的子类或者是这个类，所以不能创建指定是String的泛型类

    }
}
//泛型方法
class Alg2 {

    public <E extends Comparable<E>> E findMax(E[] array) {
        E max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Alg2 alg2 = new Alg2();
        Integer[] array = {2,23,2,3,412,32,22,23};
        Integer val = alg2.<Integer>findMax(array);
        Integer val2 = alg2.findMax(array);
        System.out.println(val);
    }

    //每次调用方法都需要对象很麻烦
    //调用泛型方法时候那个< 类型 > 可以写也可以不写
}

class Alg3 {

    public static  <E extends Comparable<E>> E findMax(E[] array) {
        E max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {
                max = array[i];
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Alg2 alg2 = new Alg2();
        Integer[] array = {2,23,2,3,412,32,22,23};
        Integer val = alg2.<Integer>findMax(array);
        System.out.println(val);
        System.out.println(Alg3.<Integer>findMax(array));
    }

    //每次调用方法都需要对象很麻烦
}






